package ar.uba.fi.algo3.algoflight.model.trayectorias;

import java.util.List;

import ar.uba.fi.algo3.algoflight.model.Direccion;
import ar.uba.fi.algo3.algoflight.model.Posicion;
import ar.uba.fi.algo3.algoflight.model.utils.Constantes;

public class TrayectoriaConPuntos extends Trayectoria {

	private Trayectoria trayectoriaRecta;

	public TrayectoriaConPuntos(List<Posicion> listaDePosiciones) {
		super(listaDePosiciones);
		direccion = Direccion.calcularDireccion(listaDePosiciones.get(0),
				listaDePosiciones.get(1));
		trayectoriaRecta = new TrayectoriaRecta(listaDePosiciones, direccion);
	}

	@Override
	public Posicion obtenerSiguientePosicion(float velocidad) {
		Posicion sigPuntoTrayectoria = null;

		if (listaDePosiciones.size() > 1) {
			sigPuntoTrayectoria = listaDePosiciones.get(1);
			Posicion sigPosicion = trayectoriaRecta
					.obtenerSiguientePosicion(velocidad);
			if (!sigPuntoTrayectoria.estaCercaDe(sigPosicion,
					Constantes.TOLERANCIA_CERCANIA_PUNTOS)) {
				sigPuntoTrayectoria = sigPosicion;
			}
		}

		return sigPuntoTrayectoria;
	}

	@Override
	public void avanzar(float velocidad) {
		Posicion sigPosicion = this.obtenerSiguientePosicion(velocidad);

		if (sigPosicion != null) {
			direccion = Direccion.calcularDireccion(listaDePosiciones.get(0),
					sigPosicion);
			trayectoriaRecta.cambiarDireccion(direccion);
			if (listaDePosiciones.get(1).estaCercaDe(sigPosicion,
					Constantes.TOLERANCIA_CERCANIA_PUNTOS)) {
				listaDePosiciones.remove(0);
				if (listaDePosiciones.size() > 1) {
					direccion = Direccion.calcularDireccion(
							listaDePosiciones.get(0), listaDePosiciones.get(1));
					trayectoriaRecta.cambiarDireccion(direccion);
				}
			} else {
				listaDePosiciones.set(0, sigPosicion);
			}
		}
	}

}
